//
//  TJTJStatusDALManager.swift
//  TJSinaWeibo
//
//  Created by 唐后能 on 16/4/26.
//  Copyright © 2016年 itheima. All rights reserved.
//

import UIKit

class TJStatusDALManager: NSObject {

    // 创建一个单例.
    static let shareDALManager:TJStatusDALManager = TJStatusDALManager()
    
    // 过期时间.
    let overTime:NSTimeInterval = 60 //单位为s.
    
    // 私有化init().
    private override init() {
        super.init()
    }
    
    
    // 删除过期的微博数据缓存.-->  当前时间-7天>创建时间
    func deleteCacheStatus(){
        
        // 过期时间.
        let overDate = NSDate(timeIntervalSinceNow: -overTime)
        
        // 转成字符串.
        let df = NSDateFormatter()
        df.dateFormat = "yyyy-MM-dd HH:mm:ss"
        df.locale = NSLocale(localeIdentifier: "EN") //为了真机也能用.
        let overDateString = df.stringFromDate(overDate)
        
        // 创建sql.
        let sql = "DELETE FROM T_Status WHERE createTime < '\(overDateString)';"
        
        TJSQLManager.shareManager.dbQueue.inDatabase { (db) -> Void in
            do {
                try db.executeUpdate(sql, values: [])
                print("清除缓存成功")
            } catch let error as NSError {
                print("清除缓存失败: \(error)")
            }
            
        }
        
    }
    
    
    /**
    加载微博数据,可能从服务器,也可能从数据库加载
    
    - parameter since_id:           下拉刷新时的最小status_id.
    - parameter max_id:             上拉加载数据的最大status_id
    - parameter loadStatusCallback: 回调
    */
    func loadStatus(since_id: Int64, max_id: Int64, loadStatusCallback: (status: [[String: AnyObject]]?, error: NSError?) -> ()) {
        // 1.查看本地数据库是否保存数据 *
        loadCacheStatus(since_id, max_id: max_id) { (status) -> () in
            if status != nil && status!.count > 0 {
                print("本地有微博数据")
                // 2.本地数据有数据直接使用本地数据库的数据
                loadStatusCallback(status: status, error: nil)
                return
            }
            
            // 3.本地没有数据,发送网络请求,去服务器加载数据
            // 1.urlString
            let urlString = "https://api.weibo.com/2/statuses/home_timeline.json"
            
            // 2.参数
            /// [String : String?]: key是String类型,value是String或nil,数组或字典中的元素不能为nil
            var parameters: [String: AnyObject] = ["access_token": (TJAccountViewModel.shareUserAccount.userAccount?.access_token!)!]
            
            // 将since_id, max_id拼接到请求参数里面
            if since_id > 0 {   // 别人转了since_id
                parameters["since_id"] = NSNumber(longLong: since_id)
            } else if max_id > 0 {
                // 返回ID小于或等于max_id的微博, 不需要等于max_id的这条微博 max_id - 1
                parameters["max_id"] = NSNumber(longLong: max_id - 1)
            }
            
            // 3.发送请求
            TJNetWorkManager.shareNetWorkManager.GET(urlString, parameters: parameters, progress: nil, success: { (_, responseObject) -> Void in
                
                // 获取微博数据
                // 看是否能转成字典, 获取字典里面的内容
                if let dict = responseObject as? [String: AnyObject], let statusesDict = dict["statuses"] as? [[String: AnyObject]] {
                    // 4.将服务器返回的数据保存到本地 *
                    self.saveCacheStatus(statusesDict)
                    
                    // 5.在将服务器返回的数据,返回给别人处理
                    loadStatusCallback(status: statusesDict, error: nil)
                }
                
                }, failure: { (_, error) -> Void in
                    loadStatusCallback(status: nil, error: error)
            })
        }
    }
    
    
    
    
    /**
     加载本地数据库
     - parameter since_id: 上拉刷新需加载的id
     - parameter max_id:   下拉加载更多需加载的id.
     - parameter callBack: 返回加载的本地数组(字典数组:有则返回字典数组,无则返回空数组.)
     */
     /// 从本地数据库加载微博数据
    private func loadCacheStatus(since_id: Int64, max_id: Int64, loadCacheStatusCallback: (status: [[String: AnyObject]]?) -> ()) {
        // 获取UID
        
        let uid = TJAccountViewModel.shareUserAccount.userAccount?.uid
        
        assert(uid != nil, "没有uid")
        
        var sql = "SELECT status_id, status, user_id FROM T_Status \n" + "WHERE user_id = \(uid!) \n"
        
        if since_id > 0 {
            // 下拉刷新
            sql += "AND status_id > \(since_id) \n"
        } else if max_id > 0 {
            // 上拉加载
            sql += "AND status_id < \(max_id) \n"
        }
        
        sql += "ORDER BY status_id DESC LIMIT 20;"
        
        print("sql: \(sql)")
        
        // 查询数据
        TJSQLManager.shareManager.dbQueue.inDatabase { (db) -> Void in
            do {
                let resultSet = try db.executeQuery(sql, values: [])
                
                // 定义字典保存数据库中加载的数据
                var statusDicts = [[String: AnyObject]]()
                
                while resultSet.next() {
                    let statusText = resultSet.stringForColumn("status")
                    
                    // 返回的是字典数组
                    // String -> NSData -> JSON
                    let data = statusText.dataUsingEncoding(NSUTF8StringEncoding)!
                    let statusDict = try NSJSONSerialization.JSONObjectWithData(data, options: []) as! [String: AnyObject]
                    
                    statusDicts.append(statusDict)
                }
                
                // 将数据库加载的微博数据返回回去
                
                loadCacheStatusCallback(status: statusDicts)
            } catch let error as NSError {
                print("加载本地微博数据出错了: \(error)")
                loadCacheStatusCallback(status: nil)
            }
        }
    }
    
    
    /**
     保存网络下载的数据到数据库
     
     - parameter statuses: 需要保存的本地字典数组.
     */
    private func saveCacheStatus(statuses:[[String:AnyObject]]) {
        
        let sql = "INSERT INTO T_Status (status_id, status, user_id) VALUES (?, ?, ?)"
        // 因为保存微博的用户是同一个,所以放在循环外面.
        let uid = TJAccountViewModel.shareUserAccount.userAccount?.uid
        // 遍历字典数据,将每个字典都插入数据库的表中.
        TJSQLManager.shareManager.dbQueue.inTransaction { (db, rollack) -> Void in
            do {
                
                for dict in statuses {
                    
                    let id = dict["id"] as! NSNumber
                    // 存入数据库中的数据要转成字符串.  dict->data->string
                    let statusData = try NSJSONSerialization.dataWithJSONObject(dict, options: NSJSONWritingOptions.PrettyPrinted)
                    let statusString = NSString(data: statusData, encoding: NSUTF8StringEncoding) as! String
                    try db.executeUpdate(sql, values: [id,statusString,uid!])
                    //                    TJPrint("保存数据成功.")
                }
            }catch let error as NSError {
                
                TJPrint("保存微博数据失败:\(error)")
            }
            
        }
    }
}
